---------------------------------------------------------------------------------------------------
--dream9
---------------------------------------------------------------------------------------------------
dream9start = gfxroom {
   ontimer      = function(s)
                    if s._frames == 1 then
                      play_music("stopper");
                    end
                    local y = 50;
                    local gfx = s:loadgfx("redlight");
                    if s._speed == nil then
                      s._speed = 200;
                    end
                    if s._x ~= nil then
                      drawing.clean(s.pic, s._x, y, 200, 600);
                    end
                    if s._x == nil then
                      s._x = -600;
                    end
                    s._x = s._x + s._speed;
                    if s._x > 800 then
                      s._x = -600;
                    end
                    sprite.copy(gfx, s.pic, s._x, y);
                    s._speed = s._speed - 2;
                  end
  ,stop         = 90
  ,next         = walk_("dream9")
  ,rate         = 50
  ,dispose      = chain_ {
                    nil_("_x"),
                    nil_("_y"),
                    nil_("_speed")
                  }
}

dream9 = scene {
   checkpoint   = true
  ,obj          = {
                     "dream9_start"
                    ,"dream9_legs"
                  }
  ,Refresh      = [[Я с трудом могу разобрать что-либо. Всё плывет перед глазами. Кажется, я на главной палубе "Ахилла",
                    но здесь нет никого, кроме меня -- по крайней мере, я никого не вижу. Всё вокруг заливает аварийный
                    свет.^
                    Я лежу на полу, скорчившись, как при судорогах, и обхватив голову руками. Мне нужно подняться.]]
  ,Stand        = walk_("dream9deck")
}

dream9_start = rooms.event
  [[Всё вокруг заливает красный пульсирующий свет, а от какого-то гортанного утробного рёва раскалывается в ушах. Я даже
    не понимаю, где нахожусь. Я зажимаю уши руками, но это не помогает. Потом вдруг истерические завывания сирены захлёбываются,
    и я перестаю что-либо слышать -- меня окружает глухая непроницаемая тишина.]]

dream9_legs = item {
   nam          = _"ноги"
  ,Stand        = redirect_("Stand", "dream9")
  ,Ascend       = redirect_("Stand", "dream9")
  ,articles     = {
                     ["Stand"] = "на"
                    ,["Ascend"] = "на"
                  }
}


---------------------------------------------------------------------------------------------------
--dream9deck
---------------------------------------------------------------------------------------------------
dream9deck = scene {
   obj          = {
                     "dream9deck_start"
                    ,"dream9deck_itself"
                    ,"dream9deck_exit"
                    ,"dream9deck_coridor"
                  }
  ,ExamSelf     = [[Мне нет дела до самого себя. Надо найти Лиду.]]
  ,Refresh      = redirect_("Exam", "dream9deck_itself")
  ,Wait         = [[Мне нужно идти. Я должен найти Лиду.]]
  ,Exit         = choose_ {
                     ["dream9deck_itself._exam"] = walk_("dream9coridor")
                    ,["default"] = "Отсюда нет выхода."
                  }
}

dream9deck_start = rooms.event
  [[Да, судя по всему, я на главной палубе. Однако глаза подводят меня, я почти ничего не вижу. Что произошло? На радарах появился
    корабль девятых, был зафиксирован рост радиационного фона. Они готовились к нападению. Однако мы ещё здесь.^
    Я оглядываюсь по сторонам, однако голова начинает кружиться, и я чуть не падаю. К тому же, я чувствую странную давящую боль в
    груди, как будто у меня раздроблены все кости.^
    Лида!^
    Эта мысль точно вспыхивает передо мной. Наверное, она до сих пор в своей каюте.^
    Я должен её найти!^
    Здесь где-то был выход в коридор... Я щурюсь, вглядываясь в марево цветов вокруг себя.]]

dream9deck_itself = item {
   _exam        = false
  ,nam          = _"главная палуба"
  ,Exam         = chain_ {
                    set_("s._exam"),
                    [[Я едва вижу, в глазах всё расплывается. Где-то впереди чернеет широкий дверной проём -- это должен быть
                      выход в коридор между палубами. Мне нужно идти. Я должен найти Лиду.]]
                  }
}:like(pBasic)

dream9deck_exit = item {
   nam          = _"выход"
  ,Walk         = walk_("dream9coridor")
  ,Approach     = redirect_("Walk")
  ,cnd          = if_("dream9deck_itself._exam")
}:like(pBuild)

dream9deck_coridor = item {
   nam          = _"коридор"
  ,Walk         = walk_("dream9coridor")
  ,Exit         = redirect_("Walk")
  ,articles     = {
                     ["Walk"] = "в"
                    ,["Exit"] = "в"
                  }
  ,cnd          = if_("dream9deck_itself._exam")
}:like(pBuild)


---------------------------------------------------------------------------------------------------
--dream9coridor
---------------------------------------------------------------------------------------------------
dream9coridor = scene {
   enter        = playonce_("spring",0)
  ,obj          = {
                     "dream9coridor_start"
                    ,"dream9coridor_itself"
                    ,"dream9coridor_exit"
                    ,"dream9deck_go"
                  }
  ,ExamSelf     = [[Мне нет дела до самого себя. Надо найти Лиду.]]
  ,Refresh      = redirect_("Exam", "dream9coridor_itself")
  ,Wait         = [[Мне нужно идти. Я должен найти Лиду.]]
}

dream9coridor_start = rooms.event
  [[Я вываливаюсь в коридор, и на секунду мне кажется, что вектор гравитации внезапно изменился -- я чуть не падаю на
    противоположную стену и едва удерживаюсь на ногах, ухватившись за поручень в стене.^
    Я в длинном коридоре, который соединяет отсеки. Мне нужно просто идти вперед. Вход в кубрик должен быть в самом
    конце.]]

dream9coridor_itself = item {
   nam          = _"коридор"
  ,Exam         = [[Зрение так и не восстанавливается. К тому же глаза слезятся. Я тру глаза рукой, но это не помогает.]]
}:like(pBasic)

dream9coridor_exit = item {
   _walk        = 0
  ,nam          = _"кубрик"
  ,Walk         = choose_ {
                     ["default"] =
                        chain_ {
                          inc_("dream9coridor_exit._walk"),
                          [[Я медленно перебираю ногами, хватаясь за поручни в стенах, как слепой. Кажется, что на
                            несколько шагов уходит целая вечность. Но я должен продолжать идти.]]
                        }
                    ,["dream9coridor_exit._walk==1"] =
                        chain_ {
                          inc_("dream9coridor_exit._walk"),
                          [[Вектор гравитации снова меняется -- или же меня подводят собственные органы чувств. Теперь я уже
                            поднимаюсь вверх, мне приходится изо всех сил держаться за поручни, чтобы не упасть.
                            Неумолимая, всё возрастающая сила упрямо тянет меня вниз, в пропасть, в кровавое марево
                            за моей спиной.]]
                        }
                    ,["dream9coridor_exit._walk==2"] =
                        chain_ {
                          inc_("dream9coridor_exit._walk"),
                          [[Я уже почти пришёл. Осталось лишь несколько шагов. Я даже вижу впереди сияющий дверной проём.]]
                        }
                    ,["dream9coridor_exit._walk==3"] = walk_("dream9cubrick")
                  }
}:like(pLocation)

dream9deck_go = item {
   nam          = "вперёд"
  ,Walk         = redirect_("Walk", "dream9coridor_exit")
}


---------------------------------------------------------------------------------------------------
--dream9cubrick
---------------------------------------------------------------------------------------------------
dream9cubrick = scene {
   _end         = false
  ,obj          = {
                     "dream9cubrick_start"
                    ,"dream9cubrick_itself"
                    ,"dream9deck_door"
                  }
  ,ExamSelf     = [[Мне нет дела до самого себя. Надо найти Лиду.]]
  ,Refresh      = redirect_("Exam", "dream9cubrick_itself")
  ,Wait         = [[Нет, я уже почти дошел. Где-то здесь должна быть дверь в её каюту.]]
  ,EndSimulation= choose_ {
                     ["default"] =
                        chain_ {
                          set_("s._end"),
                          mute_(1000,0),
                          [[Что это значит? Я же не...]]
                        }
                    ,["s._end"] = 
                        chain_ {
                          function(s)
                            hero._rets=nvl(hero._rets,0);
                            hero._rets=hero._rets+1;
                          end,
                          unlock_("endsimulation"),
                          redirect_("Open","dream9deck_door")
                        }
                  }
}

dream9cubrick_start = rooms.event
  [[В коридоре кубрика тоже никого нет. Я опираюсь о стену, чтобы немного отдышаться. Я прошёл всего несколько секций по
    коридору и совершенно выбился из сил. К счастью, в кубрике странные гравитационные искажения прекратились, пол подо мной
    ровный, и мне уже не кажется, что потолок может в любую секунду опрокинуться навзничь.^
    Я начинаю осматриваться, хотя едва вижу что-либо вокруг. Где-то здесь, совсем рядом, должна быть дверь в каюту Лиды.]]

dream9cubrick_itself = item {
   _exam        = false
  ,nam          = _"кубрик"
  ,Exam         = chain_ {
                    set_("dream9cubrick_itself._exam"),
                    mute_(3000,0),
                    [[Кажется, вот она. Я сощуриваюсь, как слепой, и узнаю на одной из дверей знакомый номер.^
                      Всё.^
                      Осталось только открыть дверь. Через несколько секунд я её увижу.]]
                  }
}

dream9deck_door = item {
   nam          = _"дверь"
  ,Open         = chain_ {
                    mute_(0,0),
                    music_("bam2"),
                    beatgame,
                    walk_("endtitles0")
                  }
  ,Exam         = [[Это дверь в каюту Лиды. Нет смысла ждать.]]
  ,Approach     = [[Надо сначала открыть дверь.]]
  ,Close        = [[Дверь и так закрыта.]]
  ,cnd          = if_("dream9cubrick_itself._exam")
}:like(pBuild)


---------------------------------------------------------------------------------------------------
--endtitles
---------------------------------------------------------------------------------------------------
function tt_(txt)
  return { type = "title", txt = txt };
end
function tr_(txt)
  return { type = "regular", txt = txt };
end
function ts_(txt)
  return { type = "small", txt = txt };
end

endtitles0 = pause {
   time         = 200
  ,next         = walk_("endtitles")
}

endtitles = gfxroom {
   enter        = function(s)
                    s.spr = s:word();
                    sprite.copy(s.spr, s.pic, 0, 226);
                  end
  ,letter       = function(s,spr,fnt,c,x)
                    local t = sprite.text(fnt, c, "white");
                    sprite.draw(t, spr, x, 0);
                    sprite.free(t);
                  end
  ,word         = function(s)
                    local fnt = drawing.font("sans-b.ttf", 92);
                    local spr = sprite.box(800, 300, "black");
                    local xs = 70;
                    s:letter(spr,fnt,"Л",xs);
                    s:letter(spr,fnt,"И",xs+150);
                    s:letter(spr,fnt,"Д",xs+300);
                    s:letter(spr,fnt,"И",xs+450);
                    s:letter(spr,fnt,"Я",xs+600);
                    return spr;
                  end
  ,ontimer      = function(s)
                    if s._frames == 150 then
                      play_music("spring",2);
                    end
                    if s._frames < 160 then
                      return;
                    end
                    local y = 226;
                    if s.spr == nil then
                      s.spr = s:word();
                    end
                    if s._x == nil then
                      s._x = 0;
                    end
                    sprite.copy(s.spr, s.pic, s._x, y);
                    s._x = s._x - 2;
                  end
  ,dispose      = function(s)
                    if s.spr ~= nil then
                      sprite.free(s.spr);
                      s.spr = nil;
                    end
                    s._x = nil;
                  end
  ,stop         = 540--360
  ,next         = walkfast2_("endtitles2")
  ,rate         = 50
}

endtitles2 = gfxroom {
   ontimer      = function(s)
                    if s._num == nil then
                      s._num = 0;
                    end
                    local yy = 200;
                    local pos = 0;
                    --drawing.clean(s.pic, 0, yy, 800, 300);
                    if s.spritelen == 0 then
                      pos = 699;
                    end
                    
                    for i,v in pairs(s.sprites) do
                      if v ~= nil then
                        v.x = v.x - 2;
                        local dy = (600 - v.h) / 2;
                        sprite.copy(v.spr, s.pic, v.x, dy);
                        if v.x <= -v.w then
                          s.sprites[i] = nil;
                        else
                          local po = v.x + v.w;
                          if po > pos then
                            pos = po;
                          end
                        end
                      end
                    end
                    
                    if pos + 100 < 800 then
                      s._num = s._num + 1;
                      if s.titles[s._num] ~= nil then
                        local h,n,mw,spr = s:drawitem(s._num);
                        s.spritelen = s.spritelen+1;
                        table.insert(s.sprites, {h=h,n=n,spr=spr,w=mw,x=pos+100});
                      end
                    end
                  end
  ,drawitem     = function(s,idx)
                    local t = s.titles[idx];
                    local mw = 0;
                    
                    for i,v in pairs(t) do
                      local fn,fs,txt = s:font(v);
                      local rw = drawing.text_width(txt, fn, fs);
                      if rw > mw then
                        mw = rw;
                      end
                    end
                    
                    local spr = sprite.box(mw+10, 300, "black");
                    local y = 0;
                    
                    for i,v in pairs(t) do
                      local fn,fs,txt,fh = s:font(v);
                      drawing.draw_text_center(spr, txt, mw, y, "gray", fn, fs, true);
                      y = y + fh + 5;
                    end
                    
                    return y,n,mw,spr;
                  end
  ,sprites      = {}
  ,spritelen    = 0
  ,font         = function(s,obj)
                    if obj.type == "title" then
                      if s.cache_tt == nil then
                        s.cache_tt = drawing.text_height("sans-b.ttf", 16);
                      end
                      return "sans-b.ttf",16, obj.txt,s.cache_tt;
                    elseif obj.type == "regular" then
                      if s.cache_tr == nil then
                        s.cache_tr = drawing.text_height("sans.ttf", 20);
                      end
                      return "sans.ttf", 20, obj.txt,s.cache_tr;
                    elseif obj.type == "small" then
                      if s.cache_ts == nil then
                        s.cache_ts = drawing.text_height("sans.ttf", 14);
                      end
                      return "sans.ttf",14, obj.txt,s.cache_ts;
                    end
                  end
  ,titles       = {
                    {
                      tt_ "платформа INSTEAD и модуль МЕТАПАРСЕР",
                      tr_ "ПЁТР КОСЫХ"
                    },
                    {
                      tt_ "оригинальный сценарий и программирование",
                      tr_ "ВАСИЛИЙ ВОРОНКОВ"
                    },
                    {
                      tt_ "музыка",
                      tr_ "ВАСИЛИЙ ВОРОНКОВ"
                    },
                    {
                      tt_ "музыка создавалась в",
                      tr_ "ALCHEMY & GARAGE BAND & AUDACITY"
                    },
                    {
                      tt_ "обработка графики",
                      tr_ "PAINT.NET & GIMP"
                    },
                    {
                      tt_ "графика",
                      tr_ "flickr.com"
                    },
                    {
                      tt_ "звуковые эффекты",
                      tr_ "freesound.org"
                    },
                    {
                      tt_ "фотографии",
                      ts_ "flickr.com/photos/nasamarshall/4971286005",
                      ts_ "flickr.com/photos/nasamarshall/6099580967",
                      ts_ "flickr.com/photos/nasamarshall/7045389347",
                      ts_ "flickr.com/photos/nasamarshall/4998376359",
                      ts_ "flickr.com/photos/zanotti/312159382",
                      ts_ "flickr.com/photos/wonderferret/2826778639",
                      ts_ "flickr.com/photos/retrogui_photos/6830698011",
                      ts_ "flickr.com/photos/jpstanley/1423479417",
                      ts_ "flickr.com/photos/49968232@N00/375735252",
                      ts_ "flickr.com/photos/75929846@N00/6178788734",
                      ts_ "flickr.com/photos/44071822@N08/4091034625",
                      ts_ "flickr.com/photos/54299533@N04/6117599621"
                    },
                    {
                      tt_ "звуковые эффекты",
                      ts_ "freesound.org/people/themfish/sounds/34200",
                      ts_ "freesound.org/people/StephenSaldanha/sounds/166515",
                      ts_ "freesound.org/people/Robinhood76/sounds/83962",
                      ts_ "freesound.org/people/klangmanufaktur/sounds/144927",
                      ts_ "freesound.org/people/CGEffex/sounds/98332",
                      ts_ "freesound.org/people/lluiset7/sounds/141333",
                      ts_ "freesound.org/people/peepholecircus/sounds/169994",
                      ts_ "freesound.org/people/Mbazzy/sounds/6805",
                      ts_ "freesound.org/people/Freezeman/sounds/153213"
                    }
                  }
  ,stop         = 2150
  ,next         = stead.restart
  ,rate         = 50
  ,dispose      = function(s)
                    s._x = nil;
                    for i,v in pairs(s.sprites) do
                      sprite.free(v.spr);
                    end
                    s.sprites={};
                    if cache_tt~=nil then
                      sprite.free_font(cache_tt);
                    end
                    if cache_tr~=nil then
                      sprite.free_font(cache_tr);
                    end
                    if cache_ts~=nil then
                      sprite.free_font(cache_ts);
                    end
                  end
}
